 /*
 *  Miradios.java
 * 
 * Clase que representa al objeto radio, la cual debe ser capaz de encenderse, apagarse, cambiar de FM/AM o AM/FM
 * permita guardar en memoria una emisora, permita seleccionar una emisora guardada en memoria
 * permita avanzar en las estaciones asi como regresar, en multiplos de 10 si es AM y en multiplos de 0.2 si es FM
 * las etaciones de FM se encuentra entre 87.9 a 107. y AM entre 530 a 1610.
 * 
 * 
 *  Universidad del Valle de Guatemala            Algoritmos y Estructura de Datos 
 *  Seccion 20
 *  Hoja de trabajo 1
 */

/**
 *
 * @author Alejandro Rojas Carne 10104
 */
public class Miradios implements NuestraInterfaz {
/**
 *Declaracion de atributos y variables necesarios para el manejo de la radio
 * 
 */
    
    private  String estado;//atributo de estado que indica si el radio esta apagado o encendido
    private  String estacion;// atributo de estado de la estacion en la que se encuentra la radio sea AM o FM
    private  String emisora;// atributo que indica en que emisora se encuentra sin importar que sea AM o FM es un string que muestra el valor
    private  double emisorafm;// valor real para emisoras en FM
    private  int    emisoraam;// valor entero para emisoras en AM
    private  String [][] estacionsave;// Arreglo para poder guardar y accesar emisoras grabadas por el usuario
    /**
     * constructor del objeto Miradios, inicializa variables y atributos con valores default asi como la memoria.
     * la memoria contendra como default la emisora FM 87.9
     */
    public Miradios (){
    estado = "OFF";
    estacion = "--";
    emisorafm = (double) 87.9 ;
    emisoraam = 530 ;
    emisora = "--" ;
    estacionsave = new String [12][2] ;
    
    for (int fil=0; fil<estacionsave.length; fil++)
            for (int col=0; col<estacionsave[fil].length; col++)
            {
					estacionsave[fil][col]= " 87.9";
                                        estacionsave[fil][0] = "FM";
            }
    
    }
    @Override
    /**
     * Metodo que permite realizar el cambio en el atributo estado entre ON y OFF, el atributo estacion entre FM y --
     * el atributo emisora entre 87.9 y -- , ademas de devolver
     * true si el estado es ON y devolver False si el estado es OFF
     */
    public boolean power() {
        boolean power1 = true;
        if (estado.equals("OFF"))
        {       
                power1 = true;
                estado = "ON";
                estacion = "FM";
                emisorafm = (float)87.9;
                emisora = " "+ emisorafm;
        }
        else
        {
                power1 = false;
                estado = "OFF";
                estacion = "--";
                emisora = "--";
        }
        return power1;
    }
    

    @Override
    /**
     * Metodo que permite cambiar de AM a FM o viceversa, esto se realiza atravez de una comparacion con el estado
     * de la estacion si FM o AM
     */
    public boolean cambio() {
        boolean cambio1 = true;
       if (estacion.equals("FM"))
                {
                estacion = "AM";
                emisora = " 530";
                        }
       else {
                estacion = "FM";
                emisora = " 87.9";
       }
       return cambio1;
    }

    @Override
    /**
     * Se determina si se encuentra en AM o FM asi aumentar en multiplos de 10 o 0.2 respectivamente
     * asi como si se encuentra en el limite superior permite iniciar de nuevo con la emisora inicial ya sea
     * en FM  o AM.
     */
    public void fw() {
        int aumentaram = 10;
        float aumentarfm = (float) 0.2;
      
      if (estacion.equals("AM"))
      {
          if (emisoraam == 1610)
          {
              emisoraam = 530;
              emisora = " " + emisoraam;
          }
      
          else 
            {
              emisoraam = emisoraam + aumentaram;
              emisora = " "+emisoraam;
            }
      }
      if (estacion.equals("FM"))
      {
          
          if (emisorafm == (float) 107.9 )
          {
              emisorafm = (float) 87.9;
              emisora = " "+ emisorafm ;
             }
          else
            {
              emisorafm = emisorafm + aumentarfm;
              emisorafm = (double)Math.round(emisorafm*10)/10;
              emisora = " "+emisorafm;
            }
      }
    }

    @Override
    /**
     * funcionamiento similar al meto fw, con la diferencia que este metodo disminuye en multiplos de 10 o 0.2 
     * si es AM o FM respectivamente y si se encuentra en el limite inferior la emisora regresa al valor del limite
     * superior de AM o FM.
     */
    public void bw() {     
        int disminuiram = 10;
        float disminuirfm = (float) 0.2;
      
      if (estacion.equals("AM"))
      {
          if (emisoraam == 530)
          {
              emisoraam = 1610;
              emisora = " "+ emisoraam;
          }
      
          else 
            {
              emisoraam = emisoraam - disminuiram;
              emisora = " "+emisoraam;
            }
    }
      if (estacion.equals("FM"))
      {
          
          if (emisorafm == (float) 87.9 )
          {
              emisorafm = (float) 107.9;
               emisorafm = (double)Math.round(emisorafm*10)/10;
              emisora = " "+ emisorafm;
          }
      
          else
            {
              emisorafm = emisorafm - disminuirfm;
              emisora = " "+emisorafm;
            }
    }
    }

    @Override
    /**
     *Permite guardar en memoria, que es una matriz de 12x2, la emisora que se desee sin importar si es FM o AM
     * las guarda en la misma memoria
     */
    public void store(int boton) {
        
        estacionsave [(boton-1)][0] = estacion ;
        estacionsave [(boton -1)][1]= emisora;
        System.out.println("Estacion guardada en el boton "+ boton);
        
    }

    @Override
    /**
     * Permite seleccionar una memoria de la matriz para volver a una emisora guardada con anterioridad
     * si no se guardo una emisora se regresa a la emisora de FM 87.9
     */
    public void select(int botons) {
        
       estacion = estacionsave [(botons -1)][0] ;
        emisora = estacionsave [(botons -1)][1];
         System.out.println("La estacion mostra pertenece al boton  "+ botons);
       
    }
    /**
     * Metodo que devuelve un string con que posee los atributos estado, estacion y emisora actuales. que al ser llamado
     * con un println permite mostrar el estado general del radio.
     */
    @Override
    public String toString(){
		String estadoradio = "Estado Power  "+ estado + "\n" ;
		estadoradio += "Estacion "+ estacion + "\n" ;
		estadoradio += "Emisora "+ emisora;
		return estadoradio;
	}

    /**
     * metodo que no se utiliza pero debe ser implementado porque la interfaz asi lo exige.
     */
    @Override
    public void salir() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    
    
}
